package com.sky.AOP;

import com.sky.annotation.Autofill;
import com.sky.constant.AutoFillConstant;
import com.sky.context.BaseContext;
import com.sky.enumeration.OperationType;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

@Aspect
@Component
@Slf4j
public class AutofillAspect {

    @Before("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.Autofill)")
    public void autoFill(JoinPoint joinPoint) throws Throwable {
        log.info("开始进行数据填充");
        //获得当前方法上注解的值
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();//获得当前方法签名
        Autofill annotation = methodSignature.getMethod().getAnnotation(Autofill.class);//获得当前方法上的注解
        OperationType value = annotation.value();//获得注解的值
        //获取当前方法的参数
        LocalDateTime localDateTime=LocalDateTime.now();
        Long updateId = BaseContext.getCurrentId();
        Object[] args = joinPoint.getArgs();
        if (args.length == 0) {
            return;
        }
        Object entity = args[0];//获取第一个参数，即当前方法的第一个参数，即实体类
        log.info("当前数据填充的值为：{}", value);
        if (value == OperationType.INSERT){
            //更新四个字段
            entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME,LocalDateTime.class).invoke(entity,localDateTime);
            entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME,LocalDateTime.class).invoke(entity,localDateTime);
            entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER,Long.class).invoke(entity,updateId);
            entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER,Long.class).invoke(entity,updateId);
        }else{
            entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME,LocalDateTime.class).invoke(entity,localDateTime);
            entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER,Long.class).invoke(entity,updateId);
        }

    }
}